#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
using namespace std;

pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;

int g_tickets = 1000;

void* route(void* args)
{
    string* name = (string*) args;
    int num = 0;
    while(true)
    {
        pthread_mutex_lock(&gmutex);
        if(g_tickets > 0)
        {
            usleep(1000); 
            cout << *name << " " << g_tickets << endl;
            g_tickets--;
            pthread_mutex_unlock(&gmutex);
            num++;
        }
        else
        {
            pthread_mutex_unlock(&gmutex);
            break;
        }
    }
    //cout << "git tickets is num :" << num << endl;
    return (void*)num;
}

int main()
{
    int num = 4;
    pthread_t tid[num];
    for(int i = 0; i < num; i++)
    {
        string* name = new string("thread - ");
        *name+=to_string(i);
        pthread_create(&tid[i],nullptr,route,(void*)name);
    }
    
    for(int i = 0; i < num; i++)
    {
        void* ret = nullptr;
        pthread_join(tid[i],&ret);
        cout << (long long)ret << endl;
    }
    return 0;
}

// void* pthreadrun(void* args)
// {
//     pthread_detach(pthread_self());//线程分离
//     string name = (char*)args;

//     int cnt = 5;
//     while(cnt)
//     {
//         cout << name << " : " << cnt << endl;
//         cnt--;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,pthreadrun,(void*)"thread 1");

//     cout << "main thread wait block 11 " << endl;

//     //pthread_join(tid,nullptr);
//     //cout << "main thread wait return" << endl;
//     int x = 10;
//     int y = 20;

//     auto Swap = [](int& x,int& y){
//         int temp = x;
//         x = y;
//         y = temp;
//     };

//     Swap(x,y);
//     cout << x << "  " << y << endl;
//     sleep(10);
//     return 0;
// }


// void threadrun(int num)
// {
//     while(num)
//     {
//         cout << "new thread: " << num << endl;
//         sleep(1);
//         num--;   
//     }
// }

// int main()
// {
//     thread mythread(threadrun,5);
//     int num = 3;
//     while(num)
//     {
//         cout << "main thread: " << num << endl;
//         sleep(1);
//         num--;
//     }
//     mythread.join();
//     return 0;
// }


// void* pthreadrun(void* args)
// {
//     list<int>* v1 = new list<int>;
//     v1->push_back(1);
//     v1->push_back(2);
//     v1->push_back(3);
//     v1->push_back(4);
//     int cnt = 5;
//     while(cnt)
//     {
//         cout << "new pthread: " << cnt << endl;
//         cnt--;
//         sleep(1);
//     }
//     return (void*)v1;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,pthreadrun,nullptr);
//     int cnt = 2;
//     while(cnt)
//     {
//         cout << "main pthread: " << cnt << endl;
//         cnt--;
//         sleep(1);
//     }

//     void* ret = nullptr;
//     pthread_join(tid,&ret);

//     list<int>* v1 = (list<int>*)ret;
//     list<int>::iterator it = v1->begin();
//     while(it != v1->end())
//     {
//         cout << *it << endl;
//         it++;
//     }
//     delete v1;
//     return 0;
// }


